package cn.huijielong.common.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;


public class PinYinUtils {
	private static Logger logger =LoggerFactory.getLogger(PinYinUtils.class);
	// pinyin4j格式类
	// 拼音字符串数组

	// 通过构造方法进行初始化
	static HanyuPinyinOutputFormat format = null;
	static String[] pinyin;
	static {

		format = new HanyuPinyinOutputFormat();
		/*
		 * 设置需要转换的拼音格式 以天为例 HanyuPinyinToneType.WITHOUT_TONE 转换为tian
		 * HanyuPinyinToneType.WITH_TONE_MARK 转换为tian1
		 * HanyuPinyinVCharType.WITH_U_UNICODE 转换为tiān
		 * 
		 */
		format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		pinyin = null;
	}

	/**
	 * 单个字进行转换小写
	 * 
	 * @param pinYinStr
	 *            需转换的汉字字符串
	 * @return 拼音字符串数组
	 */
	public static String getCharPinYin(char pinYinStr) {

		try {
			// 执行转换
			pinyin = PinyinHelper.toHanyuPinyinStringArray(pinYinStr, format);

		} catch (BadHanyuPinyinOutputFormatCombination e) {
			logger.error("", e);
		}

		// pinyin4j规则，当转换的符串不是汉字，就返回null
		if (pinyin == null) {
			return pinYinStr+"";
		}

		// 多音字会返回一个多音字拼音的数组，pinyiin4j并不能有效判断该字的读音
		return pinyin[0];
	}

	/**
	 * str转换成全拼小写
	 * 
	 * @param pinYinStr
	 * @return
	 */
	public static String getStringPinYin(String pinYinStr) {
		StringBuffer sb = new StringBuffer();
		String tempStr = null;
		// 循环字符串
		for (int i = 0; i < pinYinStr.length(); i++) {

			tempStr = getCharPinYin(pinYinStr.charAt(i));
			if (tempStr == null) {
				// 非汉字直接拼接
				sb.append(pinYinStr.charAt(i));
			} else {
				sb.append(tempStr);
			}
		}

		return sb.toString();

	}

	/**
	 * 获取字符串的首字母大写
	 * 
	 * @param pinYinStr
	 * @return
	 */
	public static String getStringFirstPinYin(String pinYinStr) {
		StringBuffer sb = new StringBuffer();
		String tempStr = null;
		String upCase=null;
		if(pinYinStr!=null&&!"".equals(pinYinStr)) {
			tempStr = getCharPinYin(pinYinStr.charAt(0));
			if (tempStr == null) {
				// 非汉字直接拼接
				sb.append((pinYinStr.charAt(0)+"").toUpperCase());
			} else {
				upCase=tempStr.toUpperCase();
				sb.append(upCase.charAt(0));
			}
			return sb.toString();
		}
		return "";


	}
}
